package com.cn.gmall.list.receiver;


import com.cn.gmall.common.mqconst.MqConst;
import com.cn.gmall.list.service.SearchService;
import com.rabbitmq.client.Channel;
import lombok.SneakyThrows;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

@Component
public class ListReceiver {

    @Autowired
    private SearchService searchService;

    /***
     * 商品上架监听
     * @param skuId
     * @param message
     * @param channel
     */
    @SneakyThrows
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = MqConst.QUEUE_GOODS_UPPER, durable = "true", autoDelete = "false"),
            exchange = @Exchange(value = MqConst.EXCHANGE_DIRECT_GOODS),
            key = {MqConst.ROUTING_GOODS_UPPER}))
    public void upperGoods(Long skuId, Message message, Channel channel) {
//        判断skuId存在否
        try {
            if (skuId != null) {
                searchService.upperGoods(skuId);
            }
        } catch (Exception e) {
            e.printStackTrace();
//----------------失败了 发送短信 运维人员维护-----写入日志/发邮件--------------
            System.out.println("商品上架出错了");
        }

        /****手动确认
         * message.getMessageProperties().getDeliveryTag():
         * 这是一个整数值，表示消息的唯一标识符（delivery tag）。
         * 通过调用message.getMessageProperties().getDeliveryTag()方法获取消息的标签。
         * 每个消息在 RabbitMQ 内部都会被分配一个唯一的标签。
         *
         * false: 这是一个布尔值，表示消息确认的模式。
         * 在这种情况下，参数值为 false，
         * 表示会确认当前消息以及标签小于等于该标签的所有消息。
         * 如果设置为 true，则只会确认当前消息。
         */
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

    }

    /***
     * 商品下架监听
     * @param skuId
     * @param message
     * @param channel
     */
    @SneakyThrows
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = MqConst.QUEUE_GOODS_LOWER,durable = "true",autoDelete = "false"),
            exchange =@Exchange(value = MqConst.EXCHANGE_DIRECT_GOODS),
            key = {MqConst.ROUTING_GOODS_LOWER}
    ))
    public void lowerGoods(Long skuId, Message message, Channel channel) {
//        判断skuId存在否
        try {
            if (skuId != null) {
                searchService.lowerGoods(skuId);
            }
        } catch (Exception e) {
            e.printStackTrace();
//----------------失败了 发送短信 运维人员维护-----写入日志/发邮件--------------

        }
//        手动确认
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

    }


}
